﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using System.Windows.Markup;

namespace BindingLesson.BindingProperties
{
    // MarupExtension这个基类不是必须继承，主要目标是希望CharConverter可以以｛｝的形式在XAML中实例化
    // 比如:<TextBlock Text="{Binding CodeValue,Converter={local:CharConverter}}"/>
    // 没有继承MarkupExtensionn的情况下，XAML中以资源或标签对象的方式进行引用
    // 比如：<TextBlock Text="{Binding CodeValue,Converter={StaticResource cc}}"/>
    public class CharConverter : MarkupExtension, IValueConverter
    {
        /// <summary>
        ///  数据从源到目标的时候，执行这个方法，将这个方法的结果显示在目标
        /// </summary>
        /// <param name="value">源数据</param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            //int.Parse(value.ToString()) * 0.1;
            // &#@e618  
            // (char)e618   ' '
            // 源的数据    64   int     
            //return (char)int.Parse(value.ToString()); 

            int p = parameter == null ? 0 : int.Parse(parameter.ToString());
            return (char)(int.Parse(value.ToString()) + p);
        }

        /// <summary>
        /// 数据从目标到源的时候。执行这个方法，将这个方法的结果提交给源
        /// </summary>
        /// <param name="value">目标数据</param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // 目标的数据   a    97 
            //value
            return (int)(value.ToString()[0]);
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return this;
        }
    }
}
